﻿// 1—100的阶乘并相加
//  1.首先要产生1到一百的阶乘
//  2.将他们加起来
//  3.检验代码是否正确

#include <stdio.h>

int main()
{
	
	while (1)
	{
		int input = 0;
		scanf_s("%d", &input);
		int i = 1;
		int ret = 1;
		int sum = 0;
		for (i = 1;i <= input;i++)
		{
			ret = ret * i;
			sum = ret + sum;
			//sum += ret;
		}
		printf("%d\n", sum);
	}
	
	return 0;
}
//初始变量会直接进入循环，先进行条件判断，在代入其中

//代码优化
//1.输入正确的数字，防止负数
//2.数据长度
//3.continue
//continue 的作用
//跳过当前循环的剩余部分：当 continue 语句执行时，程序会立即跳过当前循环中 continue 之后的代码，直接进入下一次循环。
//重新开始循环：在 while (1) 的无限循环中，使用 continue 可以让程序重新回到循环的开头，等待用户再次输入。
//#include <stdio.h>
//
//int main()
//{
//    while (1)
//    {
//        int input = 0;
//        printf("请输入一个正整数: ");
//        if (scanf_s("%d", &input) != 1 || input < 0)
//        {
//            printf("无效输入，请输入一个正整数。\n");
//            continue;
//        }
//
//        long long i = 1;
//        long long ret = 1;
//        long long sum = 0;
//
//        for (i = 1; i <= input; i++)
//        {
//            ret *= i;
//            sum += ret;
//        }
//
//        printf("从1到%d的阶乘之和为: %lld\n", input, sum);//    注意是lld
//    }
//    return 0;
//}
//你的代码的优点
//效率更高：单层循环的时间复杂度为 O(n)，而老师的代码是 O(n²)。
//更灵活：支持动态输入任意整数 input，而老师的代码只能计算固定范围（1到10）。
//你老师的代码的优点
//可读性更好：逻辑清晰，外层循环控制范围，内层循环计算阶乘。
//适合教学：双层循环的结构更容易理解阶乘的计算过程。
//改进建议
//你的代码：
//
//可以增加输入验证（如检查是否为非负整数）。
//如果不需要无限循环，可以去掉 while (1)。
//提高可读性，例如将阶乘计算和累加分开写。
//你老师的代码：
//
//可以改为单层循环以提高效率。
//支持动态输入范围。
//综合建议
//如果你的目标是实现一个高效且灵活的程序，那么你的代码更好。但如果你更注重可读性和教学目的，老师的代码更合适。在实际开发中，通常会优先选择效率高且灵活的实现方式。

//1!+2!+3! = 1 + 1*2 + 6 = 9
//int main()
//{
//	int n = 0;
//	//求n的阶乘
//	int i = 0;
//	int ret = 1;
//	int sum = 0;
//
//	for (n = 1; n <= 10; n++)
//	{
//		ret = 1;
//		for (i = 1; i <= n; i++)
//		{
//			ret = ret * i;
//		}
//		sum += ret;
//	}
//	
//	printf("%d\n", sum);
//
//	return 0;
//}